# 对应的项目目录结构如下
# - include/
#     - /ds/*.h
#     - *.h
# - lib/
#     - lib*.a
# - src/
#     - /ds/*.c
#     - *.c
# - obj/
#     -/ds/*.o
#     - *.o
# - TARGET(main)
# - Makefile

# 分别为头文件路径, 静态库路径，源文件路径, 目标文件路径
INCLUDE_DIR := ./include
LIB_DIR := ./lib
SRC_DIR := ./src
OBJ_DIR := ./obj

# TARGET即最终可执行文件 可以寻找src文件夹下子文件夹内的源文件
TARGET := server
SRCS := $(shell find $(SRC_DIR) -name '*.c')
OBJS := $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))

# CC:指定C编译器 CFLAGS:C编译器选项 DEFINES:宏定义
CC := gcc
CFLAGS := -Wall -g -I$(INCLUDE_DIR)
DEFINES :=

# 链接选项，添加mysql和yyjson库
LIBS := -L$(LIB_DIR) -pthread -lmysqlclient -lyyjson -lcrypto -lcrypt -ll8w8jwt

# 最终目标
all: $(TARGET)

# $< 表示第一个依赖文件
# $@ 表示此规则目标文件
# $^ 表示所有依赖文件
$(TARGET) : $(OBJS)
	$(CC) $(CFLAGS) $(DEFINES) $^ -o $@ $(LIBS)

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c | $(OBJ_DIR)
	mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c $< -o $@

# 伪目标 clean rebuild
.PHONY: clean rebuild

# $(RM) 即 rm -f
clean:
	$(RM) $(TARGET) $(OBJS)
	find $(OBJ_DIR) -type d -empty -delete
rebuild: clean all